<?php

namespace fastphp;

use Exception;
use Smarty;

/**
 * 视图基类
 */
class View
{

    protected $smarty;
    protected $variables = [];
    protected $_controller;
    protected $_action;

    function __construct($_controller, $_action)
    {
        $this->_controller = $_controller;
        $this->_action = $_action;

        // 初始化 Smarty 对象
        $this->smarty = new Smarty();
        try {
            $this->smarty->debugging = Debugging;
            $this->smarty->caching = Caching;
            $this->smarty->cache_lifetime = CacheLifetime;

            if (!is_dir(CacheDir)) {
                mkdir(CacheDir);
            }

            if (!is_dir(CompileDir)) {
                mkdir(CompileDir);
            }

            // 设置 Smarty 的模板目录和编译目录（根据你的项目结构进行调整）
            $this->smarty->setTemplateDir(TemplateDir);
            $this->smarty->setCompileDir(CompileDir);
            $this->smarty->setConfigDir(ConfigDir);
            $this->smarty->setCacheDir(CacheDir);

            // 你可以在这里设置其他 Smarty 配置，比如默认模板文件扩展名等
            $this->smarty->left_delimiter = LEFT_DELIMITER;
            $this->smarty->right_delimiter = RIGHT_DELIMITER;
        } catch (Exception $e) {
            require_once DefErrorPage;
        }
    }

    /**
     * 设置变量方法
     */
    public function set($name, $value)
    {
        $this->variables[$name] = $value;
        $this->smarty->assign($name, $value); // 将变量分配给 Smarty
    }

    /**
     * 显示模板
     */
    public function render()
    {
        // 设置模板文件（相对于模板目录的路径）
        $template = $this->_controller . '/' . $this->_action . SMARTY_SUF; // 假设你使用 .tpl 作为模板文件扩展名

        // 检查模板文件是否存在（可选，Smarty 通常会处理这种情况并给出错误）
        if (file_exists(APP_PATH . 'application/views/' . $template)) {
            try {
                // 显示模板
                $this->smarty->display($template);
            } catch (\Throwable $th) {
                echo $th->getMessage();
            }
        } else {
            // 处理模板文件不存在的情况（例如，显示错误页面）
            echo "Template file not found: " . $template;
        }
    }
}
